package This_Super_Overload_Override;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/8 20:10
 */

/**
 * 在子类中创建了一个与父类中名称相同、返回值类型相同、参数列表的方法相同，只是方法体中的实现不同，以实现不同于父类的功能，
 * 这种方式被称为方法重写(override)，又称为方法覆盖、方法复写。
 * 特别说明：
 * 一大：
 * 子类方法的修饰符要>=父类的修饰符
 * 两小：
 *    子类返回值类型<=父类返回值类型
 *    子类抛出的异常<=父类抛出的异常
 * 当两个方法形成重写关系时，可以在子类方法中通过super.run()形式调用父类的run()方法，
 * 其中super.run不必放在第一行语句，因此此时父类对象已经构造完毕，先调用父类的run()方法还是先调用子类的run()方法是根据程序逻辑决定的。
 * 静态方法不能被重写
 */
public class Override1 {
    public static void main(String[] args) {
        B1 s1=new B1();
        s1.Generation();//普通测试子类重写的方法
        System.out.println("-------------------------");
        B2 s2=new B2();
        s2.jump();
    }
}
//普通重写
class A1 {
    void Generation(){//父类的方法
        System.out.println("父");
    }
}
class B1 extends A1 {
    @Override
    void Generation(){//子类重写父类的方法
        System.out.println("子");
    }
}
class A2{
    void jump(){
        System.out.println(A2.class.getName()+"在跳");
    }
}
class B2 extends A2{
    @Override
    void jump(){
        System.out.println(B2.class.getName()+"在跳");
        super.jump();//子类用super调用父类方法，super不用放在第一行
    }
}
class A3{
    static void eat(){
        System.out.println("吃草");
    }
}
class B3 extends A3{
    //@Override注解会出错，静态方法无法重写
    static void eat(){
        System.out.println("吃土");
    }
}